<?php
namespace backend\controllers;

use Yii;
use yii\data\Pagination;
use common\models\GameType;
use yii\helpers\BaseJson;

/**
 * 游戏类型管理
 *
 * @author jois
 */
class GameTypeController extends BaseController
{

    /**
     * 游戏类型列表
     */
    public function actionIndex()
    {
        // 获取第一级类型
        $types = GameType::topNode()->all();

        $input = Yii::$app->request->get();

        // 根据参数获取信息
        if (! empty($input['key'])) {
            $query = GameType::find()->where("type_name like '%" . $input['key'] . "%'");
        } else {
            $query = GameType::find();
        }

        // 根据一级类型过滤
        if (! empty($input['type_id'])) {
            $query->where("parent_path like '%" . $input['type_id'] . "%'")->orWhere('type_id=' . $input['type_id']);
        }

        // 根据排序抓取分页列表数据
        if (! empty($input['alias'])) {
            $query->orderBy("alias {$input['alias']}");
        }
        $countQuery = clone $query;

        // 分页处理
        $pages = new Pagination([
            'totalCount' => $countQuery->count()
        ]);
        $models = $query->offset($pages->offset)
            ->limit($pages->limit)
            ->all();

        return $this->render('index', compact('models', 'pages', 'types'));
    }

    /**
     * 添加或修改游戏类型
     */
    public function actionEdit()
    {
        // 获取第一级游戏类型
        $types = GameType::topNode()->all();

        $model = null;
        $id = Yii::$app->request->get('type_id', 0);
        if ((int) $id > 0) {
            $model = GameType::findOne((int) $id);
            $parent_node = $model->parentNode()->one();
        }
        return $this->render('edit', compact('model', 'parent_node', 'types'));
    }

    /**
     * 保存新增或修改的游戏类型
     */
    public function actionSave()
    {
        $post = Yii::$app->request->post();

        // 验证
        if (Yii::$app->request->isPost && ! empty($post)) {
            $parent_id = array_filter($post['path']);
            // 编辑时判断
            if (isset($post['type_id']) && ! empty($parent_id)) {
                // 设置表单回带
                Yii::$app->session->setFlash('post', $post);

                // 上级类型不能为自己，及其子孙机构所在机构
                $pid = end($parent_id);
                $parent_info = GameType::findOne((int) $pid);

                $path_node = array_filter(explode(':', $parent_info->path));
                if (in_array($post['type_id'], $path_node)) {
                    Yii::$app->session->setFlash('message_error', '编辑失败，新的类型不能是其本身或其子孙类型');
                    return $this->redirect(Yii::$app->request->referrer);
                }
            }

            // 上级类型ID
            $post['parent_id'] = empty($parent_id) ? 0 : end($parent_id);
            // var_dump($post);exit();
            // 保存数据
            $game_type = isset($post['type_id']) ? GameType::findOne([
                'type_id' => (int) $post['type_id']
            ]) : new GameType();
            $game_type->attributes = $post;
            $game_type->parent_id = $post['parent_id'];
            $game_type->save();

            // 验证数据
            if (! empty($game_type->getErrors())) {
                Yii::$app->session->setFlash('message_error', $game_type->getErrors());
                return $this->redirect(Yii::$app->request->referrer);
            }
            Yii::$app->session->setFlash('message_success', isset($post['type_id']) ? '编辑成功！' : '添加成功！');
            $session = Yii::$app->session;
            unset($session['post']);
            return $this->redirect('/game-type/index', 200);
        }
        throw new \yii\web\MethodNotAllowedHttpException('操作异常，不支持非post提交保存数据');
        return false;
    }

    /**
     * 游戏类型删除
     */
    public function actionDelete()
    {
        if (! Yii::$app->request->isPost) {
            throw new \yii\web\MethodNotAllowedHttpException('操作异常，不支持非post提交删除数据');
            return false;
        }
        // 验证游戏类型是否存在
        $query = GameType::findOne((int) Yii::$app->request->post('type_id'));
        if (is_object($query)) {
            // 执行删除，并返回成功信息
            $query->delete();
            Yii::$app->session->setFlash('message_success', '删除成功！');
            return $this->redirect('/game-type/index', 200);
        }
        // 不存在返回上一页，并返回错误信息
        Yii::$app->session->setFlash('message_error', '此游戏类型不存在！');
        return $this->redirect(Yii::$app->request->referrer);
    }

    /**
     * 获取某类型的下级游戏类型
     */
    public function actionSubTypes()
    {
        $types = array();
        $parent_id = Yii::$app->request->get('parent_id');
        if (is_array($parent_id)) {
            $ids = [];
            foreach ($parent_id as $id) {
                $cid = GameType::findOne($id)->childNode()->column();
                $ids = array_merge($ids, $cid);
            }
            $types = GameType::findAll($ids);
        } elseif ($parent_id > 0) {
            $types = GameType::findOne($parent_id)->childNode()->all();
        }
        return BaseJson::encode($types);
    }
}
